package com.zzyl.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

@Configuration
public class ThreadPoolConfig {

    /**
     * 核心线程池大小
     */
    private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors();

    /**
     * 最大可创建的线程数
     */
    private static final int MAX_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2;

    /**
     * 队列最大长度
     */
    private static final int QUEUE_CAPACITY = 50000;

    /**
     * 线程池维护线程所允许的空闲时间
     */
    private static final int KEEP_ALIVE_SECONDS = 60;

    /**
     * 创建 ExecutorService 的Spring Bean配置
     */
    @Bean
    public ExecutorService executorService() {
        // 创建一个AtomicInteger 用于生成线程的名字
        AtomicInteger c = new AtomicInteger(1);
        // 创建一个LinkedBlockingQueue 作为任务队列，队列容量为QUEUE_CAPACITY = 50000
        LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(QUEUE_CAPACITY);
        // 返回一个 ThreadPoolExecutor 实例
        return new ThreadPoolExecutor(
                CORE_POOL_SIZE,     // 核心线程数量
                MAX_POOL_SIZE,  // 最大线程数量
                KEEP_ALIVE_SECONDS,  // 临时线程的最大存活时间
                TimeUnit.MILLISECONDS,  // 临时线程的存活时间单位 这里是毫秒
                queue, // 线程池的任务队列，任务排队的地方
                r -> new Thread(r, "zzyl-pool-" + c.getAndIncrement()), // 线程池的线程工厂，用于创建新的线程。
                new ThreadPoolExecutor.DiscardPolicy() // 线程的拒绝策略。线程都在忙（核心线程和非核心线程），任务队列都满了的时候，新任务的处理策略
        );
    }
}